/*
 *  Ecran.cpp
 *  Ray Tracing
 *
 *  Definition des methodes de la classe ecran
 *
 *  Created by Jean-Marc Comby + Romain Dequesne on Sun Mar 28 2004.
 *  Copyright (c) 2004. All rights reserved.
 *
 */

#include "Image.hpp"

#include "Utils/Erreur.hpp"

#include <stdlib.h>

using namespace std;

/**
 * Constructeur par défaut.
 */
Image::Image()
  : Ecran( 0, 0 )
{}

/**
 * Constructeur de copie. Ici il est important de recopier
 * correctement l'Ecran.
 *
 * @param c Image à copier.
 */
Image::Image(const Image &c)
  : Ecran( c.Largeur, c.Hauteur )
{
  Screen.resize( Largeur );
  for (unsigned int i(0); i < Largeur; i++)
    Screen[ i ]. assign( c.Screen[ i ] . begin(), c.Screen[ i ] . end() );
}

/**
 * Constructeur permettant d'initialiser une Image avec les dimensions
 * voulues.
 *
 * @param largeur dimension horizontale de l'image.
 * @param hauteur dimension verticale de l'image.
 */
Image::Image(const int &largeur, const int &hauteur)
  : Ecran( largeur, hauteur )
{
  Screen.resize( Largeur );
  for (unsigned int i(0); i < Largeur; i++)
    Screen[ i ].resize( Hauteur );
}

/**
 * Le destructeur n'a rien de spécial à faire.
 */
Image::~Image()
{}

/**
 * Permet de changer la Couleur du pixel voulu.
 *
 * @param x position du pixel selon l'axe horizontal.
 * @param y position du pixel selon l'axe vertical.
 * @param coul nouvelle Couleur du pixel désiré.
 */
void Image::setPixel(const unsigned int &y, const unsigned int &x,
		     const Couleur &coul)
{
  if (  x < Largeur &&  y < Hauteur )
    Screen[ x ][ y ] = coul;
}

/**
 * Permet de changer la hauteur de l'Image.
 *
 * @param h nouvelle valeur de Hauteur.
 */
void Image::hauteur(const unsigned int &h)
{
  Hauteur = h;
  for (unsigned int i(0); i < Largeur; i++)
    {
      Screen[ i ].resize( h );
    }
}

/**
 * Permet de changer la largeur de l'Image.
 *
 * @param l nouvelle valeur de Largeur.
 */
void Image::largeur(const unsigned int &l)
{
  Largeur = l;
  Screen.resize( l );
}

/**
 * Lance une exception du type Erreur si l'on veut accéder à un pixel
 * inexistant.
 *
 * @param x position du pixel selon l'axe horizontal.
 * @param y position du pixel selon l'axe vertical.
 * @return une référence constante sur la Couleur du pixel voulu.
 */
const Couleur& Image::pixel(const unsigned int &y, const unsigned int &x) const
{
  if ( x < Largeur && y < Hauteur )
    return Screen[ x ][ y ];
  else
    {
      cerr << "Dépassement dans l'acces de l'image : tentative d'accéder à "
	   << x << ", " << y << " sur une image " << Screen.size() << " x "
	   << Screen[0].size() << endl;
      cerr << "Consulter le log  pour résoudre le bug" << endl;
      Erreur err( true, 1, 
		  "Si vous utilisez une texture, modifier la fréquence",
		  "Classe Image" );
      err.ecrire( "Erreur.txt" );
      throw err;
    }
}

/**
 * @return une référence constante sur Hauteur.
 */
const unsigned int& Image::hauteur() const
{
  return Hauteur;
}

/**
 * @return une référence constante sur Largeur.
 */
const unsigned int& Image::largeur() const
{
  return Largeur;
}
